package lvm

import (
	"context"
	"fmt"
	"github.com/sirupsen/logrus"
	"os"
	"syscall"
)

// VGRemove 存储池删除
func VGRemove(ctx context.Context, vgName, volumePath string) (err error) {
	if getVG(ctx, vgName) == nil {
		err = ErrNotFound
		return
	}
	/*
		首先存储池下将正在使用的逻辑卷卸载掉 通过 umount 命令
		再删除卷组 通过 vgremove 命令
	*/
	lvs, err := LVList(ctx)
	if err != nil {
		return ErrEmpty
	}
	for _, lv := range lvs {
		if lv.VGName == vgName {
			//todo 卸载部分lv后出现卸载失败的回滚情况
			target := fmt.Sprintf("%s%c%s%c%s", volumePath, os.PathSeparator,
				lv.VGName, os.PathSeparator, lv.Name)
			if err = syscall.Unmount(target, 0); err != nil {
				logrus.Warnf("[vgremove] umount lv-%v :lvPath-%v error: %v", lv.Name, lv.Path, err.Error())
			}

			// 可以不删除逻辑分区直接强制删除卷组
			//if err := LVRemove(ctx, vgName, lv.Name); err != nil {
			//	logrus.Warnf("remove lv error: %v", err.Error())
			//}
		}
	}
	if _, err = execCommand(ctx, "vgremove", "-f", vgName); err != nil {
		logrus.Warnf("[vgremove] remove vg-%v error: %v", vgName, err.Error())
		return
	}
	if getVG(ctx, vgName) != nil {
		err = ErrCommand
		return
	}
	return nil
}
